home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
oper_sys
/
oasis
/
oasisegs.lha
/
egs
/
tspa.lisp
< prev
Wrap
Lisp/Scheme
|
1992-04-23
|
3KB
|
69 lines
(proclaim '(type (array fixnum 2) *dist*))
(proclaim '(type (array fixnum 1) *best*))
(proclaim '(type (array fixnum 1) *v*))
(proclaim '(type fixnum *min*))
(proclaim '(function run (fixnum) fixnum))
(proclaim '(function search (fixnum fixnum) nil))
(proclaim '(function gen ((array fixnum 2) fixnum) nil))
(defvar *dist* nil)
(defvar *best* nil)
(defvar *v* nil)
(defvar *min* 65536)
(defun run (n)
(declare (type fixnum n))
(setf *dist* (make-array (cons n (cons n nil))
:element-type 'fixnum
:initial-element 0))
(setf *best* (make-array (cons n nil)
:element-type 'fixnum))
(setf *v* (make-array (cons n nil)
:element-type 'fixnum))
(setf *min* 65536)
(gen *dist* *n*)
(search 0 0) )
(defun search (k sum)
(declare (type fixnum k)
(type fixnum sum) )
(if (= k (- *n* 1))
(if (> *min* (setf sum (+ sum (aref *dist* (aref *v* k) 0))))
(do ((i 0 (+ i 1)))
((= i n) (setf *min* sum))
(declare (type fixnum i))
(setf (aref *best* i) (aref *v* i)) ))
(do ((i (+ k 1) (+ i 1)))
((= i n) nil)
(declare (type fixnum i))
(if (> *min* (+ sum (aref *dist* (aref *v* k) (aref *v* i))))
(let ((x (aref *v* i))
(y (aref *v* (+ k 1))) )
(declare (type fixnum x)
(type fixnum y) )
(setf (aref *v* i) y)
(setf (aref *v* (+ k 1)) x)
(search (+ k 1) (+ sum (aref *dist* (aref *v* k) x)))
(setf (aref *v* i) x)
(setf (aref *v* (+ k 1)) y) )))))
(defun gen (mat n)
(declare (type (array fixnum 2) mat)
(type fixnum n) )
(let ((seed 197)
(b 0) )
(declare (type fixnum seed)
(type fixnum b) )
(do ((i 0 (+ i 1)))
((= i n) nil)
(declare (type fixnum i))
(do ((j (+ i 1) (+ j 1)))
((= j n) (setf (aref *v* i) i))
(declare (type fixnum j))
(setf seed (rem (+ (* 4757 seed) 1) 32768))
(setf b (+ 1 (rem (truncate (/ seed 16)) 256)))
(setf (aref mat i j) b)
(setf (aref mat j i) b) ))))